package com.sunrise.estoque.bean;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.annotation.Resource;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ComponentSystemEvent;

import lombok.Getter;
import lombok.Setter;

import org.springframework.stereotype.Controller;

import com.sunrise.estoque.servico.ManterAjusteEstoqueService;
import com.sunrise.estoque.visao.AjusteEstoqueForm;
import com.sunrise.generico.bean.ManterBean;
import com.sunrise.generico.dataModel.ProdutoDataModel;
import com.sunrise.generico.entidade.AjusteEstoque;
import com.sunrise.generico.entidade.EstoqueAjustado;
import com.sunrise.generico.entidade.Filial;
import com.sunrise.generico.entidade.Produto;
import com.sunrise.generico.entidade.iface.EntidadeManter;
import com.sunrise.generico.enums.MotivoAjusteEstoque;
import com.sunrise.generico.enums.Status;
import com.sunrise.generico.util.MessagesUtil;
import com.sunrise.generico.visao.Filtro;

@ManagedBean
@ViewScoped
@Controller
public class ManterAjusteEstoqueBean extends ManterBean<AjusteEstoque> {

	@Resource
	@Getter
	private ManterAjusteEstoqueService ajusteEstoqueService;

	@Getter
	@Setter
	@Resource
	private AjusteEstoqueForm formulario;

	@Override
	public void preRenderNew(ComponentSystemEvent event) {
		if (getEntidade() == null) {
			inicializarEntidade();
		}
		getFormulario().setFiliais(getAjusteEstoqueService().listarFiliaisPorUsuario(obterUsuarioLogado()));
		if(getFormulario().getFiliais() != null && !getFormulario().getFiliais().isEmpty()){
			getEntidade().getFilial().setId(getFormulario().getFiliais().iterator().next().getId());
		}
	}

	@Override
	public void inicializarEntidade() {
		setEntidade(new AjusteEstoque());
		getEntidade().setFilial(new Filial());
		carregarFormulario();
	}

	private void carregarFormulario() {
		getFormulario().setProdutoFiltro(new Produto());
		getFormulario().setProdutosSelecionar(new ProdutoDataModel(new ArrayList<Produto>()));
		getFormulario().setSalvo(false);
	}

	@Override
	public List<AjusteEstoque> iniciarlizarListEntidade() {
		return new ArrayList<AjusteEstoque>();
	}

	@Override
	public void preRenderList(ComponentSystemEvent event) {
		setFiltro(new Filtro());
		getFormulario().setFiliais(getAjusteEstoqueService().listarFiliaisPorUsuario(obterUsuarioLogado()));

		if(getFormulario().getFiliais() != null && !getFormulario().getFiliais().isEmpty()){
			getFiltro().setIdFilial(getFormulario().getFiliais().iterator().next().getId());
		}
		
		getFormulario().setMotivos(Arrays.asList(MotivoAjusteEstoque.values()));
		inicializarEntidade();
		setFiltro(new Filtro());
		setEntidades(getAjusteEstoqueService().buscarPorFiltros(getFiltro()));
		getFormulario().setStatusAjuste(Arrays.asList(Status.values()));
	}

	public void buscarPorFiltros() {
		setEntidades(getAjusteEstoqueService().buscarPorFiltros(getFiltro()));
	}

	public void adicionarProdutos() {
		if (getFormulario().getProdutosSelecionados() != null) {
			if (getEntidade().getEstoquesAjustados() == null) {
				getEntidade().setEstoquesAjustados(new ArrayList<EstoqueAjustado>());
			}
			getEntidade().getEstoquesAjustados().addAll(
					getAjusteEstoqueService().adicionarProtudosSelecionados(getFormulario().getProdutosSelecionados(), getEntidade().getFilial().getId()));
			getFormulario().setProdutosSelecionar(new ProdutoDataModel(new ArrayList<Produto>()));
			getFormulario().setProdutosSelecionados(null);
		}
	}

	public void buscarProdutosSelecionar() {
		getFormulario().setProdutosSelecionar(
				new ProdutoDataModel(getAjusteEstoqueService().buscarProdutosPorCodigoNome(
						getFormulario().getProdutoFiltro())));
	}

	public List<String> autoCompleteProdutoPorNome(String nome) {
		getFormulario().getProdutoFiltro().setNome(nome);
		List<Produto> produtosComplete = getAjusteEstoqueService().buscarProdutoPorNome(
				getFormulario().getProdutoFiltro().getNome());
		List<String> listaEntidades = new ArrayList<String>();
		for (EntidadeManter e : produtosComplete) {
			listaEntidades.add(e.getNome());
		}
		return listaEntidades;
	}

	public void removerProdutoAjuste() {
		getEntidade().getEstoquesAjustados().remove(getFormulario().getEstoqueAjustadoRemover());
	}

	@Override
	public String salvar() {
		getEntidade().setCriador(obterUsuarioLogado());
		getAjusteEstoqueService().inserir(getEntidade());
		MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("criadoSucesso"));
		buscarPorFiltros();
		return getListar();
	}

	@Override
	public String salvarContinuar() {
		getEntidade().setCriador(obterUsuarioLogado());
		getAjusteEstoqueService().inserir(getEntidade());
		MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("criadoSucesso"));
		return criarEntidade();
	}
	
	public void validarAjusteEstoque() {
		getFormulario().setSalvo(true);
		if (getEntidade().getEstoquesAjustados() == null || getEntidade().getEstoquesAjustados().isEmpty()) {
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("produtosObrigatorios"));
			getFormulario().setSalvo(false);
		} else { 
			Boolean mudancaEstoque = true;
			for (EstoqueAjustado estoqueAjustado : getEntidade().getEstoquesAjustados()) {
				if (!estoqueAjustado.getValorAnterior().equals(estoqueAjustado.getValorPosterior())) {
					mudancaEstoque = false;
				}
			}
			if (mudancaEstoque) {
				getFormulario().setSalvo(false);
				MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("naoHouveMudancaEstoque"));
			}
		}
	}

	public void cancelarAjuste() {
		getAjusteEstoqueService().cancelarAjuste(getEntidade());
	}

}
